package com.sojson.config.interceptor;

import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sojson.base.BaseInterceptor;
import com.sojson.config.exception.TransErrorCode;
import com.sojson.config.exception.TransException;
import com.sojson.util.servlet.ServletUtil;
import com.sojson.util.token.TokenUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * 判断是否拥有访问的权限
 * 
 * @author liu
 * @date 2020-11-02
 */
@Slf4j
public class PermissionInterceptor implements BaseInterceptor {

    /**
     * Handler要执行了(过滤器执行结束了),如果被过滤器拦截,就不会执行
     * 拦截处理程序的执行。在HandlerMapping确定适当的处理程序对象之后调用,但在HandlerAdapter调用处理程序之前
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        // 判断是否登录
        if (!TokenUtil.isLogin()) {
            throw new TransException(TransErrorCode.NOT_LOGIN);
        }

        // 获取访问路径
        String url = getRequestMapping(request);

        // 获取用户权限
        Set<String> permissions = TokenUtil.getPermission();
        if (!permissions.contains(url)) {
            throw new TransException(TransErrorCode.NOT_USER_PERMISSION);
        }

        return Boolean.TRUE;
    }

    // /**
    // * Handler执行结束了,如果被过滤器拦截,就不会执行,如果被拦截器拦截,就不会执行(如果返回的是@ResponseBody,返回的数据已固定)
    // * 在HandlerAdapter实际调用处理程序之后调用,但在DispatcherServlet呈现视图之前
    // */
    // @Override
    // public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
    // ModelAndView modelAndView) throws Exception {
    // BaseInterceptor.super.postHandle(request, response, handler, modelAndView);
    // }
    //
    // /**
    // * Handler呈现视图了,如果被过滤器拦截,就不会执行
    // * 请求处理完成后的回调,即呈现视图后的回调。将在处理程序执行的任何结果上调用,因此允许进行适当的资源清理
    // */
    // @Override
    // public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    // throws Exception {
    // BaseInterceptor.super.afterCompletion(request, response, handler, ex);
    // }

    /**
     * 获取客户端访问的地址
     * 
     * @param request
     * @return
     */
    private String getRequestMapping(HttpServletRequest request) {
        return ServletUtil.getRequestMapping(request);
    }

    /**
     * 获取当前拦截器的名字
     */
    @Override
    public String getName() {
        String name = "perms";
        log.info("权限验证拦截器(PermissionInterceptor)注入成功,拦截权限为" + name);
        return name;
    }

}